package pingu.reseau;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import pingu.interface_graphique.PinguGame;
import pingu.monde.Plateau;
import pingu.reseau.messages.*;

public class PinguServeur {

    public static final int GAMEPLAYSTATE          = 1;
	
	private ServerSocket socketServeur;
	private List<ConnexionTCPActive> clients;
	
	public PinguServeur(int port) throws IOException{
		this.socketServeur = new ServerSocket(port);
		this.clients = new ArrayList<ConnexionTCPActive>();
	}
	
	public boolean launchGame() throws IOException{
		boolean salonRdy=true;
		if(this.clients.size()>0){
			for(int i=0;i<this.clients.size();i++){
				if(!this.clients.get(i).isReady()){
					salonRdy=false;
					System.out.println("Player "+this.clients.get(i).getSocket().getInetAddress()+":"+this.clients.get(i).getSocket().getPort()+" not ready");
				}
			}
			if(salonRdy==true){
				System.out.println("Launching game");
				//PinguGame game = new PinguGame(true);
				MAP msg = new MAP(110);
				for(int i=0;i<this.clients.size();i++){
					this.clients.get(i).send(msg);
				}
			}
		} else { salonRdy = false; }
		return salonRdy;
	}

    public static void main(String[] args) throws IOException, ClassNotFoundException 
    {
    	//on lance le serveur et on lit les commandes du System.in....
    	//ca ne marche pas tres bien (le scanner peut "bloquer") mais ca ne posera pas de probleme
    	//lorsqu'il y aura un GUI
		Scanner scan = new Scanner(System.in);
		System.out.println("Port du serveur : ");
		String prt = scan.next();
    	PinguServeur serveur = new PinguServeur(new Integer(prt));
    	System.out.println("Serveur lance sur "+prt);
    	//Boucle d'acceptation des clients : "salon"
		while(true) {
			// Acceptation de connexions entrantes
			Socket socketClient = serveur.socketServeur.accept();
			System.out.println("Nouvelle connexion "+socketClient);

			// Creation et lancement Thread de gestion du client entrant
			ConnexionTCPActive ca = new ConnexionTCPActive(socketClient, serveur);
			serveur.clients.add(ca);
			Thread t = new Thread(ca);
			t.start();
			
			if("go".equals(scan.next())){
		//	if("RDY".equals(((Message)serveur.clients.get(0).getEntree_socket().readObject()).getType())
		//			&& (Boolean)((Message)serveur.clients.get(0).getEntree_socket().readObject()).getValue()){
				boolean rdy = serveur.launchGame();
				if(!rdy){System.out.println("Salon vide ou un ou certains joueurs pas prets");}
			}
		}
		
    }
}
